package com.naiterui.ehp.bs.doctor.service;

import java.util.List;
import java.util.Map;
import java.util.Set;

import com.naiterui.common.repository.page.PageParamVO;
import com.naiterui.common.repository.page.PageVO;
import com.naiterui.ehp.bp.bo.doctor.PatientRealtionStatusBO;
import com.naiterui.ehp.bp.bo.doctor.RecomPatientBO;
import com.naiterui.ehp.bp.domain.Patient;
import com.naiterui.ehp.bp.domain.PatientPersonDoctor;
import com.naiterui.ehp.bp.support.exception.BusinessException;
import com.naiterui.ehp.bp.utils.sort.ABCUtil.ABCVO;
import com.naiterui.ehp.bs.doctor.prodocl.MPatientDocument;
import com.naiterui.ehp.bs.doctor.vo.DeletePatientVO;
import com.naiterui.ehp.bs.doctor.vo.MemberVO;
import com.naiterui.ehp.bs.doctor.vo.MyPatientVO;
import com.naiterui.ehp.bs.doctor.vo.PatientDetailVo;
import com.naiterui.ehp.bs.doctor.vo.PatientNameVO;
import com.naiterui.ehp.bs.doctor.vo.PatientRemarkInfoVO;
import com.naiterui.ehp.bs.doctor.vo.PatientSimpleVO;
import com.naiterui.ehp.bs.doctor.vo.PatientVo;
import com.naiterui.ehp.bs.doctor.vo.casefile.CaseDetailVO;
import com.naiterui.ehp.bs.doctor.vo.casefile.CaseListVO;
import com.naiterui.ehp.bs.doctor.vo.patient.FamilyLiteVO;

/**
 * 患者服务
 *
 * @version 2015年6月22日 上午10:35:04 by chenlin
 * @Description 概述
 */
public interface IPatientService {


    /**
     * <根据患者姓名首字母进行ABC列表>
     * <详细描述>
     *
     * @param doctorId
     * @param groupId
     * @param _v       客户端版本号
     * @param _p       平台
     *
     * @return
     *
     * @throws BusinessException List<ABCPatientVo> <返回值描述>
     * @Throws 异常信息
     * @History 2015年6月23日 下午10:01:05 by chenlin
     * @Modify By Liudelong 2015年12月3日 添加版本号参数
     */
    List<ABCVO<PatientVo>> findPatientABCList(Long doctorId, Long groupId) throws Exception;

    /**
     * 根据患者id查看患者详细信息
     *
     * @param patientId
     * @param _v        客户端版本号
     * @param _p        平台
     *
     * @return
     *
     * @throws BusinessException
     */
    PatientDetailVo getPatientDetail(Long doctorId, Long patientId) throws BusinessException;

    /**
     * 获取患者病例列表
     * IPatientService.getCaseList()<BR>
     * <P>Author : Amber </P>
     * <P>Date : 2015年9月14日 </P>
     *
     * @param doctorId
     * @param patientId
     * @param page
     * @param num
     *
     * @return
     */
    PageVO<CaseListVO> getCaseList(Long doctorId, Long patientId, int page, int num) throws BusinessException;

    /**
     * 获取患者病历档案详情，V1.5病历档案支持8张图，处理旧版客户端奔溃问题，本接口为旧版逻辑，会对图片数量做限制。
     * IPatientService.getCaseDetail()
     *
     * @param doctorId
     * @param patientId
     * @param caseId
     *
     * @return
     *
     * @throws BusinessException
     * @Author Amber
     * @Date 2015年12月14日
     * @end 1.4.0
     * @since 1.0.0
     */
    CaseDetailVO getCaseDetail(Long doctorId, Long patientId, String caseId) throws BusinessException;


    /**
     * 获取患者map(id,实体)
     * IPatientService.getPatientMap()
     *
     * @param patientIds
     *
     * @return
     *
     * @Date 2016年3月24日
     * @since 2.2.1
     */
    Map<Long, Patient> getPatientMap(Set<Long> patientIds);

    /**
     * 更新特殊关注患者状态
     * IPatientService.saveSpecPatient()
     *
     * @param doctorId
     * @param patientId
     *
     * @Author Amber
     * @Date 2016年6月15日
     * @since 1.0.0
     */
    void saveSpecPatient(Long doctorId, Long patientId);

    /**
     * 获取我的患者数据，包括abc列表和特别关注列表
     * IPatientService.getMyPatients()
     *
     * @param doctorId
     *
     * @return
     *
     * @Author Amber
     * @Date 2016年6月15日
     * @since 1.0.0
     */
    MyPatientVO getMyPatients(Long doctorId) throws Exception;

    /**
     * 根据医生ID获取指定患者信息(姓名为空展示昵称)
     * PatientServiceImpl.getPatientsByDoctorId()
     *
     * @param doctorId
     * @param patientIds
     *
     * @return
     *
     * @Author guoyongxiang
     * @Date 2017年4月2日
     * @since 2.7.0
     */
    List<PatientVo> getPatientsByDoctorId(Long doctorId, List<Long> patientIds) throws Exception;

    /**
     * 分页获取一段时间的新患者列表
     *
     * @param doctorId    医生ID
     * @param pageParamVO 分页信息
     *
     * @return
     *
     * @Description
     * @History 2017年6月10日 by wangchuan
     */
    PageVO<PatientRemarkInfoVO> getPagedPatientByPeriods(Long doctorId, PageParamVO pageParamVO);

    /**
     * 获取患者个人信息详情
     *
     * @param doctorId  医生ID
     * @param patientId 患者ID
     *
     * @return
     *
     * @Description
     * @History 2017年6月10日 by wangchuan
     */
    PatientRemarkInfoVO getPatientInfo(Long doctorId, Long patientId) throws BusinessException;

    /**
     * 获取患者信息
     *
     * @param doctorId         医生ID
     * @param patientId        患者ID
     * @param containsNickname 是否取患者昵称。true取，false不取
     *
     * @return
     *
     * @throws BusinessException
     * @Description
     * @History 2017年7月28日 by wangchuan
     * @since V2.9.0
     */
    PatientRemarkInfoVO getPatientInfo(Long doctorId, Long patientId, boolean containsNickname) throws BusinessException;

    /**
     * 处理患者填写的病情描述
     *
     * @param patientDocument 患者填写病情
     * @param showDefault     是否显示默认的描述“无”
     *
     * @return
     *
     * @Description
     * @History 2017年6月12日 by wangchuan
     */
    PatientDetailVo handleDiseaseDesc(MPatientDocument patientDocument, boolean showDefault);

    /**
     * 更新患者信息
     *
     * @param doctorId      医生ID
     * @param patientId     患者ID
     * @param patientInfoVO 备注信息
     *
     * @Description
     * @History 2017年6月13日 by wangchuan
     */
    void saveOrUpdatePatientInfo(Long doctorId, Long patientId, PatientRemarkInfoVO patientInfoVO) throws BusinessException;

    /**
     * 患者备注名反写--推药服务
     *
     * @param doctorId    医生ID
     * @param patientId   患者ID
     * @param patientName 患者姓名
     *
     * @throws BusinessException
     * @Description 处方笺填写姓名，反写为备注名
     * @author wangchuan
     * @Date 2017年7月31日
     * @since V2.9.0
     */
    boolean saveRemarkname(Long doctorId, Long patientId, String patientName, Integer gender, Integer age, String ageUnit)
            throws BusinessException;

    /**
     * 内部接口获取患者信息
     *
     * @param doctorId      医生ID
     * @param patientId     患者ID
     * @param fetchNickname 是否获取患者昵称，默认获取
     *
     * @return
     */
    RecomPatientBO getInnerPatient(Long doctorId, Long patientId, Integer fetchNickname) throws BusinessException;

    /**
     * 患者简略信息
     *
     * @param doctorId
     * @param patientId
     *
     * @return
     *
     * @Description
     * @author wangchuan
     * @Date 2017年8月8日
     * @since V2.9.0
     */
    PatientSimpleVO getPatientSimpleInfo(Long doctorId, Long patientId) throws BusinessException;

    /**
     * 根据医生id获取患者名称信息
     * IPatientService.getPatientNames()
     *
     * @param doctorId
     * @param namekey
     *
     * @return
     *
     * @Author mudou
     * @Date 2017年8月24日
     * @since 2.9.0
     */
    Map<Long, PatientNameVO> getPatientNames(Long doctorId, String namekey);


    /**
     * 查询病历页筛选条件
     * IPatientService.getScreenList()
     *
     * @param doctorId
     * @param patientId
     *
     * @return
     *
     * @Author lichaopi
     * @Date 2018年6月1日
     * @since 1.0.0
     */
    List<MemberVO> getScreenList(Long doctorId, Long patientId) throws BusinessException;

    /**
     * <pre>
     * 删除医患关系
     * </pre>
     *
     * @param doctorId  医生ID
     * @param patientId 患者ID
     */
    void deletePatientRelation(Long doctorId, Long patientId) throws BusinessException;

    /**
     * 恢复医患关系
     *
     * @param doctorId   医生id
     * @param patientIds 患者id
     *
     * @throws BusinessException
     */
    void updatePatientRecover(Long doctorId, List<Long> patientIds);

    /**
     * <pre>
     *     医患关系是否删除，如果已经删除，那么返回true，否则返回false
     * </pre>
     *
     * @param doctorId  医生ID
     * @param patientId 患者ID
     *
     * @return 如果已经删除，那么返回true，否则返回false
     */
    PatientRealtionStatusBO isdDleteDoctorPatientRelation(Long doctorId, Long patientId) throws BusinessException;

    /**
     * <pre>
     * 通过医生id患者id获取医患关系
     * </pre>
     *
     * @param doctorId  医生id
     * @param patientId 患者id
     *
     * @return 医患关系表
     *
     * @throws BusinessException
     */
    PatientPersonDoctor getPatientPersonDoctor(Long doctorId, Long patientId) throws BusinessException;


    /**
     * 根据医生ID获取删除患者列表
     *
     * @param doctorId 医生ID
     *
     * @return
     */
    List<DeletePatientVO> getPatientDeleteList(Long doctorId);

    List<PatientVo> findPatientByPatientId(Long doctorId, String patientIds);

    /**
     * 查询患者家庭成员
     *
     * @param patientId
     *
     * @return
     *
     * @throws BusinessException
     */
    List<FamilyLiteVO> findFamilyByPatientId(Long patientId) throws BusinessException;

    /**
     * 获取就诊人线下病例H5页地址
     * 
     * @param inquirerId
     * @return
     * @throws BusinessException
     */
    String getHisH5Url(Long inquirerId) throws BusinessException;
}
